//#ifndef BoundaryField_H
//#define BoundaryField_H
//
//#include <vector>
//#include <string>
//#include <iostream>
//#include <map>
//
//#include <hdf5.h>
//
//#include "Config/Config.h"
//#include "Parallel/ParallelMPI.h"
//#include "Mesh/ParallelMesh.h"
//
//using namespace std;
//
//
//template<class Type>
//class BoundaryField
//{
//
//public:
//
//    BoundaryField(string name_, Config* config_, ParallelMPI* pmpi_, std::string faceGroupName_);
//
//    BoundaryField(EasyMesh::ParallelMesh* mesh_);
//
//    BoundaryField(const BoundaryField<Type>& boundaryField);
//
//    void operator = (const BoundaryField<Type>& boundaryField);
//
//    BoundaryField() {};
//
//    ~BoundaryField();
//
//    inline int size() const
//    {
//        return data.size();
//    }
//
//    inline int globalSize() const
//    {
//        return data_global.size();
//    }
//
//    void set_value(const Type& value)
//    {
//        for(int i = 0; i < data.size(); i++)
//        {
//            data[i] = value;
//        }
//    }
//
//    void multiply(const Type& value)
//    {
//        for(int i = 0; i < data.size(); i++)
//        {
//            data[i] *= value;
//        }
//    }
//
//    inline Type& operator () (int i)
//    {
//        return data[i];
//    };
//
//    inline Type operator () (int i) const
//    {
//        return data[i];
//    };
//
//
//    void cal_average_field();
//
//    void cal_global_field();
//
//    string name;
//
//    Config* config;
//
//    ParallelMPI* pmpi;
//
//    EasyMesh::ParallelMesh* mesh;
//
//    std::string faceGroupName;
//
//    vector<Type> data;
//    vector<Type> data_global;
//
//    //for mpi all reduce
//    vector<Type> data_global_temp;
//
//    //now data_average is only used in IO module, for figure plot 
//    vector<Type> data_average;
//    vector<Type> data_average_global;
//
//private:
//
//};
//
//template<class Type>
//class BoundaryFieldCollection
//{
//
//public:
//
//    BoundaryFieldCollection(string name_, Config* config_, ParallelMPI* pmpi_);
//
//    BoundaryFieldCollection(EasyMesh::ParallelMesh* mesh_);
//
//    ~BoundaryFieldCollection();
//
//    void set_value(const Type& value)
//    {
//        for (auto iter = boundaryFieldMap.begin(); iter != boundaryFieldMap.end(); iter++)
//        {
//            auto& boundaryField = iter->second;
//
//            boundaryField.set_value(value);
//        }
//    }
//
//
//    void cal_average_field()
//    {
//        for (auto iter = boundaryFieldMap.begin(); iter != boundaryFieldMap.end(); iter++)
//        {
//            //log_info << iter->first;
//            auto& boundaryField = iter->second;
//
//            boundaryField.cal_average_field();
//        }
//    }
//
//    
//    void cal_global_field()
//    {
//        for (auto iter = boundaryFieldMap.begin(); iter != boundaryFieldMap.end(); iter++)
//        {
//            auto& boundaryField = iter->second;
//
//            boundaryField.cal_global_field();
//        }
//    }
//
//    int getFaceNumber()
//    {
//        int faceNumber = 0;
//        for (auto iter = boundaryFieldMap.begin(); iter != boundaryFieldMap.end(); iter++)
//        {
//            auto& boundaryField = iter->second;
//
//            faceNumber += boundaryField.globalSize();
//        }
//        return faceNumber;
//    }
//
//    Config* config;
//
//    ParallelMPI* pmpi;
//
//    EasyMesh::ParallelMesh* mesh;
//
//    std::string name;
//
//
//
//    std::map<std::string, BoundaryField<Type>> boundaryFieldMap;
//
//private:
//
//};
//
//
//
//#endif
